package com.zzb.service.es;

import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Component
public class ESHighlight {

    /**
     *
     * @param searchHit searchHit
     * @param <T> 实体类型
     * @return 实体类
     * 高亮设置
     */
    public <T> T highlight(SearchHit<T> searchHit) {
        //得到Entity对象
        T entity = searchHit.getContent();
        //得到需要高亮显示的Map集合
        Map<String, List<String>> highlightFields = searchHit.getHighlightFields();
        //判断集合是否为空，不为空进行高亮赋值，为空直接返回
        if (highlightFields.size() != 0) {
            //得到Map集合的Key值，用于判断哪个属性需要高亮显示
            Set<String> keySet = highlightFields.keySet();
            //遍历Key的集合
            for (String key : keySet) {
                //通过Key得到value值，即需要高亮显示的内容
                String attribute = highlightFields.get(key).get(0);
                //获得实体的类型
                Class<?> entityClass = entity.getClass();
                try {
                    //根据key获得实体类的高亮字段
                    Field field = entityClass.getDeclaredField(key);
                    //修改字段权限，设置为可修改
                    field.setAccessible(true);
                    //对该字段进行赋值
                    field.set(entity, attribute);
                } catch (NoSuchFieldException | IllegalAccessException e) {
                    e.printStackTrace();
                }
           /* //判断key
            if ("username".equals(key)) {
                //对属性进行高亮赋值
                entity.setUsername(attribute);
            } else if ("email".equals(key)) {
                entity.setEmail(attribute);
            } else if ("address".equals(key)) {
                entity.setAddress(attribute);
            }*/
            }
        }
        return entity;
    }
}
